/****************************************************
          File Name:35-4.c
          Author: Abby Cin
          Mail: abbytsing@gmail.com
          Created Time: Sat 06 Sep 2014 02:27:52 PM CST
*****************************************************/
/*
 * 这里我用物理2核 逻辑4核的机器做的测试
 * 用time ./a.out parameter的方式运行
 * 发现 参数为2时(即在不同的CPU(这里是核))结果为
 *	time ./a.out 2
 * ./a.out 2  0.17s user 2.14s system 99% cpu 2.310 total
 * ksysguard显示为CPU1 和 CPU4在大量使用
 * 发现 参数为1时(即在不同的CPU(这里是核))结果为
 * 	time ./a.out 1
 * ./a.out 1  0.28s user 2.12s system 50% cpu 4.777 total
 * ksysguard显示为CPU1在大量使用
 * 明显在多个核心的协作下速度快,而且从ksysguard的显示来看,
 * 各个核的组合方式并不简单!!!
 * 
 * !!!再次强调,这里用的是多核但CPU做的测试!!!
 * 
 * 至于多CPU系统上在一个CPU上运行回比多个CPU运行的速度快
 * 是因为利用了CPU的高速缓冲器,因为硬件限制，暂时不能得以证明
 * 
 */

#define _GNU_SOURCE
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<sched.h>

void err(char *fun)
{
    perror(fun);
    exit(1);
}

int main(int argc ,char *argv[])
{
   cpu_set_t set; 
   int len,i,fd[2];
   char store[46], *buf="thisisatestandyoumayaskmewhythisstringissolong";

   if(pipe(fd)==-1)
       err("pipe");

   len=atoi(argv[1]);

   switch(fork())
   {
       case -1:
           err("fork");
       case 0:
           if(len==1)
           {
                CPU_ZERO(&set);
                CPU_SET(0,&set); //     物理上(core1)
           }
           else if(len==2)
           {
		        CPU_ZERO(&set);
                CPU_SET(3,&set); //      物理上(core2) 
           }
           if(sched_setaffinity(getpid(),len,&set)==-1)
               err("sched_setaffinity--child");
           for(i=0;i<2000000;i++)
           {
                close(fd[1]);
                if(read(fd[0],store,4)==-1)
                    err("read-pipe");
           }
           break;
       default:
            CPU_ZERO(&set);
            CPU_SET(0,&set); //     物理上(core1)

           if(sched_setaffinity(getpid(),1,&set)==-1)
               err("sched_setaffinity--parent");
           for(i=0;i<2000000;i++)
           {
                close(fd[0]);
                if(write(fd[1],buf,4)==-1)
                    err("write-pipe");
           }
            break;
   }
   exit(0);
}
